using System;
using System.Collections.Generic;
using System.Linq;

namespace FrameIdentityReq.Frames
{
    public static class BytesExtention
    {

        public static List<T> ToList<T>(this IEnumerable<T> o)
        {
            return new List<T>(o);
        }

        public static List<byte> PackFrameForSynchronization(this IList<byte> bytes)
        {
            var result = bytes.ToList().DuplicateDle();
            result.Insert(0, (byte)FrameDownTypeEnum.STX);
            result.Insert(0, (byte)FrameDownTypeEnum.DLE);
            result.Add((byte)FrameDownTypeEnum.DLE);
            result.Add((byte)FrameDownTypeEnum.ETX);
            return result;
        }

        public static List<byte> UnpackFrameForSynchronization<T>(this IList<byte> bytes)
        {
            bytes.RemoveAt(0);
            bytes.RemoveAt(0);
            bytes.RemoveAt(bytes.Count - 1);
            bytes.RemoveAt(bytes.Count - 1);
            return bytes.ToList().RemoveDuplicateDle();
        }

        public static List<byte> DuplicateDle(this List<byte> bytes)
        {
            for (int i = bytes.FindLastIndex((x) => x == (byte)FrameDownTypeEnum.DLE);
                i != -1;
                i = bytes.FindLastIndex(i - 1, (x) => x == (byte)FrameDownTypeEnum.DLE))
            {
                bytes.Insert(i, (byte)FrameDownTypeEnum.DLE);
                if (i <= 0) break;
            }

            return bytes;
        }

        public static List<byte> RemoveDuplicateDle(this List<byte> bytes)
        {
            for (int i = bytes.FindIndex((x) => x == (byte)FrameDownTypeEnum.DLE) + 1;
                i != 0 && i < bytes.Count;
                i = bytes.FindIndex(i, (x) => x == (byte)FrameDownTypeEnum.DLE) + 1)
            {
                if (bytes[i] == (byte)FrameDownTypeEnum.DLE) bytes.RemoveAt(i);
            }

            return bytes;
        }

    }
}